﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DMA.SGDB.DAL;
using DMA.SGDB.Util;
using System.Data;

namespace DMA.SGDB.BLL
{
    public class ProdutoBLL
    {

        ProdutoDAL produtoDal;

        public void Insert(PRODUTO_IT produto)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                produtoDal.Insert(produto);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public String Update(PRODUTO_IT produto)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                produtoDal.Update(produto);

                return "Registro atualizado com sucesso!";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public String Delete(int idProduto)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                produtoDal.Delete(idProduto);

                return "Registro excluído com sucesso!";
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable GetAll()
        {
            try
            {
                produtoDal = new ProdutoDAL();
                IList<PRODUTO_IT> allRecords = produtoDal.GetAll();
                return CreateTable(allRecords, null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable GetAllEstoque()
        {
            try
            {
                produtoDal = new ProdutoDAL();
                IList<PRODUTO_IT> allRecords = produtoDal.GetAll();
                return CreateTableEstoque(allRecords, null);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public PRODUTO_IT LoadById(int idPRODUTO_IT)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                return produtoDal.LoadById(idPRODUTO_IT);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<PRODUTO_IT> GetDuplicateRecord(PRODUTO_IT produto)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                IList<PRODUTO_IT> duplicateRecord = produtoDal.GetDuplicateRecord(produto);
                return duplicateRecord;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<PRODUTO_IT> GetDuplicateDescription(PRODUTO_IT produto)
        {
            try
            {
                produtoDal = new ProdutoDAL();
                IList<PRODUTO_IT> duplicateName = produtoDal.GetDuplicateDescription(produto);
                return duplicateName;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private DataTable CreateColumns(DataTable table)
        {
            try
            {
                table.Columns.Add("ID");
                table.Columns.Add("Nome");
                table.Columns.Add("Estoque Atual");
                table.Columns.Add("Estoque Mínimo");
                table.Columns.Add("Descrição");
                table.Columns.Add("Preço Real");
                table.Columns.Add("% Lucro");
                table.Columns.Add("Preço Final");
                table.Columns.Add("Unidade de Medida");
                table.Columns.Add("Medida");

                return table;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable CreateTable(IList<PRODUTO_IT> listOfRecords, String key)
        {
            try
            {
                DataTable tableRecords;
                DataRow newRow;

                tableRecords = new DataTable();
                CreateColumns(tableRecords);

                foreach (PRODUTO_IT produto in listOfRecords.Reverse())
                {
                    newRow = tableRecords.NewRow();

                    newRow[0] = produto.COD_PRO;
                    newRow[1] = produto.NOME_PRO;
                    newRow[2] = produto.QUANT_PRO;
                    newRow[3] = produto.QUANT_MIN_PRO;
                    newRow[4] = produto.DESCR_PRO;
                    newRow[5] = produto.PRECO_PRO;
                    newRow[6] = produto.LUCRO_PRO;
                    newRow[7] = produto.PRECO_VENDA_PRO;
                    newRow[8] = produto.UNI_MED_PRO;
                    newRow[9] = produto.QUANT_MED_PRO;

                    tableRecords.Rows.Add(newRow);
                }

                return tableRecords;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private DataTable CreateColumnsEstoque(DataTable table)
        {
            try
            {
                table.Columns.Add("ID");
                table.Columns.Add("Nome do Produto");
                table.Columns.Add("Estoque Atual");
                table.Columns.Add("Estoque Mínimo");

                return table;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DataTable CreateTableEstoque(IList<PRODUTO_IT> listOfRecords, String key)
        {
            try
            {
                DataTable tableRecords;
                DataRow newRow;

                tableRecords = new DataTable();
                CreateColumnsEstoque(tableRecords);

                foreach (PRODUTO_IT produto in listOfRecords.Reverse())
                {
                    newRow = tableRecords.NewRow();

                    newRow[0] = produto.COD_PRO;
                    newRow[1] = produto.NOME_PRO;
                    newRow[2] = produto.QUANT_PRO;
                    newRow[3] = produto.QUANT_MIN_PRO;

                    tableRecords.Rows.Add(newRow);
                }

                return tableRecords;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public string Encrypt(String message, String key)
        {
            //return Util.Encryption.Encryptstring(message, key);
            return null;
        }

        public string Decrypt(String message, String key)
        {
            //return Util.Encryption.Decryptstring(message, key);
            return null;
        }

    }
}
